(for Internet Explorer)
ファイルを作成するときに
【引数】
IsEnabled
SafeFileUpdate を実行するかどうか
Function  new_IsSafeFileUpdateStack( IsEnabled as boolean ) as IsSafeFileUpdateStack
を実行します。
返り値のオブジェクトが削除されたら、指定は無効になります。
(src)
  Dim  sf : Set sf = new_IsSafeFileUpdateStack( True )
  CreateFile  "File1.txt", "abc"
サンプル
テスト
→ T_File.vbs [T_CreateFile]
g_FileOptions = new FileOptionsClass

Class  FileOptionsClass
  Public Property Get  CharSet    '// as lower case string.  ADODB.Stream.Charset
  Public Property Get  CharSetEx  '// as Empty, c.UTF_8_No_BOM
  Public Property Get  LineSeparator     '// as ADODBConsts.Keep
  Public Property Get  IsSafeFileUpdate  '// as boolean
End Class
(src)
Sub  WriteVBS_Comment( Path as string, StartTag as string, EndTag as string,
    Text as string, Opt as Empty )
VBScript のファイルの中のコメントに、複数行の文字列を書き込みます。
【引数】
Path
StartTag
VBScript ファイルのパス、Empty =
VBScript ファイルの中の、書き込みを開始する1つ上の行にあるキーワード
EndTag
Opt
書き込む最後の行の1つ下の行にあるキーワード
Empty を指定してください
StartTag と EndTag に指定したキーワードがヒットしないよう、下記のサンプルにあるように + でつなぐ
などの対策をしてください。
テスト
→ T_FileInScript.vbs
T_WriteVBS_Comment
ソース
→ vbslib.vbs
Text
書き込む文字列。 先頭に ' は不要です
サンプル
WriteVBS_Comment  Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", _
    "abc" +vbCRLF+_
    "DEF" +vbCRLF, Empty

'-------------------------------------------------------------------[FileA.txt]
'((( これはテキストファイルの代わりです )))
'
'END
'------------------------------------------------------------------[/FileA.txt]
スクリプト(実行前)
スクリプト(実行後)
WriteVBS_Comment  Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", _
    "abc" +vbCRLF+_
    "DEF" +vbCRLF, Empty

'-------------------------------------------------------------------[FileA.txt]
'abc
'DEF
'------------------------------------------------------------------[/FileA.txt]
abc
DEF
関連
→ ReadVBS_Comment
Sub  WriteVBSLibFooter( OutFileStream as TextStream, Opt as WriteVBSLibFooter_Option )
【引数】
OutFileStream
開いている書き込むファイル
WriteVBSLibFooter_Option
Class  WriteVBSLibFooter_Option
    Public  CommandPromptMode  '// as integer
End Class
Opt
オプション or Empty
… Empty でないなら g_CommandPrompt の値を変更します
(src)
現在実行している、メイン.vbs ファイルの中にある --- start of vbslib include --- 以降を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より前にあるときは、何もしません。
を出力します。 (メイン.vbs ファイルの最後にするとき)
関連
CommandPromptMode
WriteVBSLibFooter  file, Empty
サンプル
Sub  WriteVBSLibHeader( OutFileStream as TextStream, Opt as WriteVBSLibHeader_Option )
【引数】
OutFileStream
開いている書き込むファイル
WriteVBSLibHeader_Option
Class  WriteVBSLibHeader_Option
  Public  m_OverCommandPrompt
End Class
Opt
オプション or Empty
… Empty でないなら g_CommandPrompt の値を変更します
(src)
現在実行している、メイン.vbs ファイルの中にある --- end of vbslib include --- まで(先頭から)を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より後にあるときは、何もしません。
を出力します。 (メイン.vbs ファイルの最初にするとき)
    Set  file = OpenForReplace( "file1.html", Empty )
    file.Replace  "<TopOfContexts/>", "<TopOfContexts/>"+vbCRLF+ "new Topic"
    file = Empty
Function  OpenForReplace( SrcPath as string, DstPath as string ) as ReplaceTextFile1
テキストファイルの内容を変更します。
【引数】
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
ランダムアクセスに対応しています。 OpenForRead や OpenForWrite のようにシーケンシャル
(ファイルの先頭から順番)にアクセスする必要はなく、ReplaceTextFile1::Replace などを
任意の順番で呼び出すことができます。
    Set  file = OpenForReplace( "file1.txt", Empty )
    file.Replace  "Value = 0", "Value = 1"
    file = Empty
DstPath を Empty にすると、DstPath = SrcPath にした時と同じ動きをします。
file1.txt
Value = 0
Value = 1
→ T_Replace.vbs
テスト
関連
TopOfContexts タグの後ろに new Topic を追加する
Value の設定値を 0 から 1 に変える
変更する内容は、返り値のメソッドに指定します。
タグに囲まれた複数行を変更する
上と同じ内容の短縮形
OpenForReplace( "file1.txt", Empty ).Replace  "Value = 0", "Value = 1"
file1.txt
Value = 0
Value = 1
ソース
サンプル
サンプル
サンプル
サンプル
補足
→ vbslib.vbs
サンプル
文字列を編集することでテキストファイルの内容を変更する
    Set  file = OpenForReplace( "file1.txt", Empty )
    file.Text = Replace( file.Text, "Value = 0", "Value = 1" )
    file = Empty
Value = 0
Value = 1
file1.txt
変更前が Unicode 形式ファイルのときは、変更後も Unicode 形式ファイルになります。
T_OpenForReplace
返り値のオブジェクトが削除されるタイミングでエラーが発生中(Err.Number <> 0  or
g_Err2.Number <> 0) のときは、ファイルを作成または更新しません。
重要なファイルを上書き更新するときは、OpenForReplace の DstPath 引数に一時的に
出力するパスを指定し、その一時ファイルを作成した後(ファイルを閉じた後)で、
を呼び出してください。 ただし、内部で2〜3回のファイルコピーを行います。 
重要なファイルを上書き更新するとき
行単位でファイルの一部を置き換える
(src)
テキストを置き換えます。
テキストファイルの内容の変更を完了します。
サンプル
指定のタグで囲まれたテキストを置き換えます。
取得
テキストを置き換えます。
指定のタグで囲まれたテキストを置き換えます。
編集中のファイルの内容。
Dim  ReplaceTextFile1::Text as string
編集中のファイルの内容。
この内容を直接変更することで、ファイルの内容を変更することができます。
テスト
→ T_Replace.vbs
T_OpenForReplaceText
    Set rep = OpenForReplace( "file1.txt", Empty )
    rep.Text = Replace( rep.Text, "from", "to" )
    rep = Empty
サンプル
関連
Sub  ReplaceTextFile1::Replace( FromText as string, ToText as string )
テキストを置き換えます。
【引数】
FromText
ToText
置き換える前のテキスト、または VBScript.RegExp
置き換えた後のテキスト
置き換えた後のテキストが存在するときは、置き換えを行いません。
これは、VBS の Replace 関数と結果が異なりますが、追加的な置き換えをしたときに、多重的に
追加されることがなくなります。
例:
f.Replace  "a = 0",  "a = 0 : b = 0"
置き換える前
置き換えた後
a = 0
a = 0 : b = 0
a = 0 : b = 0
a = 0 : b = 0
… [a = 0 : b = 0 : b = 0] にはなりません
a = 0 の後に b = 0 を追加する
テスト
→ T_Replace.vbs
T_OpenForReplaceCharSet
T_OpenForReplace
→ vbslib.vbs
ソース
を FromText 引数に指定すると、パターンマッチングにより置き換え対象を
検索します。 ToText は、
と同様に、$1 などを指定することもできます。
T_OpenForReplaceRegExp
例:
OpenForReplace( "file1.txt", Empty ).Replace  new_RegExp( "from.*", False ), "to"
Sub  ReplaceTextFile1::ReplaceRange( StartOfFromText as string, EndOfFromText as string,
                                     ToText as string )
指定のタグで囲まれたテキストを置き換えます。
【引数】
StartOfFromText
EndOfFromText
置き換える前のテキストが始まる場所にあるタグ(テキスト)
置き換える前のテキストが終わる場所にあるタグ(テキスト)
置き換えた後のテキスト。 通常、タグも含む。
ToText
置き換えサンプル
StartOfFromText = "<Tag>", EndOfFromText = "</Tag>" とします。
ToText
置き換える前
置き換えた後
abc<Tag>123</Tag>def
<Tag>456</Tag>
abc<Tag>456</Tag>def
abc<Tag>123</Tag>def
456
abc456def
<Tag>
123
456
</Tag>
<Tag>
789
</Tag>
<Tag>
789
</Tag>
サンプル
    Set  file = OpenForReplace( "file1.html", Empty )
    file.ReplaceRange  "<NewTopic>", "</NewTopic>", _
        "<NewTopic>"+vbCRLF+ "new Topic" +vbCRLF+"</NewTopic>"
    file = Empty
テスト
→ T_Replace.vbs
関連
置き換える範囲は、複数行であってもかまいません。
T_OpenForReplaceRange
→ vbslib.vbs
ソース
デストラクタから自動的に呼ばれますが、明示的に呼び出すこともできます。
Sub  ReplaceTextFile1::Close()
テキストファイルの内容の変更を完了します。
Dim  ReplaceTextFile1::IsSaveInTerminate as boolean or Empty
オブジェクトが削除されるタイミングで保存するかどうか。
Empty のときは、エラーが発生している状態でなければ保存します。
temporary_path = "FileA.txt.updating"
CreateFile  temporary_path, "新情報!"
SafeFileUpdateEx  temporary_path,  "FileA.txt",  Empty
Sub  SafeFileUpdateEx( TemporaryFilePath as string,  ToFilePath as string,  Option_ as string )
ファイルを安全に更新します。 上書き移動します。
【引数】
TemporaryFilePath
ToFilePath
新しい内容が書かれた削除する一時ファイルのパス
更新するファイルのパス
Option_
Empty、または、g_VBS_Lib.ToTrashBox
SafeFileUpdate を呼び出している途中で、ファイルの更新やバックアップなどに失敗
したら、エラーが発生しますが、ファイルの内容は、消えることなく、元に戻ります。
ただし、新しい内容は保存できていないので、エラー復帰して、別のディスクに保存
できるようにしてください。
サンプル
FileA.txt の内容を、"新情報!" という内容に更新します。
一時的に存在するファイル temporary_path に、新しい内容を出力する必要があります。
SafeFileUpdateEx を呼び出した後は、temporary_path の場所にファイルは無くなります。
更新するファイルを直接開いてライトするプログラムの場合、ライトしている途中で、
容量不足になったり、接続できなくなったりしてエラーになると、更新する前の内容
が消えてしまいます。 それだけでなく、更新した後の内容も保存できない可能性が
あります。 その場合、ファイルに格納していた情報がすべて消えてしまいます。
SafeFileUpdate は、そのリスクを回避します。
→ vbslib.vbs
ソース
Option_ = g_VBS_Lib.ToTrashBox を指定すると、
と同じ動きになります。
テスト
→ T_SafeCopy.vbs
また、一時的に存在するファイル(一時ファイル)のパスは、出力するファイルのパスの最後に
updating という拡張子を追加したパスに標準化すれば、ファイルの上書き保存に失敗した
という状況が推測しやすくなります。 また、拡張子を変更することで、不完全なファイルを
アプリケーションに渡さないようになります。
を使う必要がなくなります。
"新情報!"
"FileA.txt"
T_SafeFileUpdate
新しい内容を書くファイルの拡張子を .updating にすると、
SafeFileUpdateEx  path +".updating",  path,  Empty
例:
内部でファイルのコピーを2〜3回行います。
Sub  SafeFileUpdate( FromTmpFilePath as string, ToFilePath as string )
ファイルを安全に更新します。 上書き移動して、元の内容はゴミ箱に入ります。
【引数】
FromTmpFilePath
ToFilePath
新しい内容が書かれたファイルのパス
更新するファイルのパス
テスト
→ T_SafeCopy.vbs # [T_SafeFileUpdate]
関連
→ vbslib.vbs
ソース
Sub  ConvertToFullPath( SrcFilePath as string, DstFilePath as string )
%FullPath(..\SampleLib)%
テキストファイルの中の相対パスや特殊フォルダのパスをフル・パスに変換してコピーします。
変換前
変換後の例
C:\folder\SampleLib
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
【引数】
SrcFilePath
DstFilePath
変換前のファイルのパス
変換後のファイルのパス(新規作成または上書き), Empty不可
(src)
DstFilePath 引数が指すファイルが入ったフォルダーを、相対パスの基準にしたフル・
パスに変換します。
基準を SrcFilePath ではなく DstFilePath にしている理由は、1つのテンプレート的な
ファイル(SrcFilePath) に対して、複数の場所(DstFilePath) で使用することができるように
するためです。
→ TextFileConvertFormat::Set_
参考
テスト
Unicode ファイルにするときは、次のように設定してから ConvertToFullPath を呼んでください。
Dim  c : Set c = g_VBS_Lib
Dim  cs : Set cs = new_TextFileCharSetStack( c.Unicode )
ConvertToFullPath  "ans.txt", "ans_tmp.txt"
%FullPath(.)%
C:\folder\current
→ T_ConvAbs.vbs # ConvertToFullPath
参考
テキストファイルの中に書かれた %FullPath( )% などの % % で囲まれた部分を置き換えます。
(*1)
(*1)
(*1)
%FullPath(..\SampleLib)%
変換前の例
変換後の例
C:\folder\SampleLib
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
vbslib の提供するいくつかの関数の中で、% を使った文字列変換関数が使えます。
% を使った環境変数も展開されます。
%FullPath(.)%
C:\folder\current
の c.RightHasPercentFunction
(*1)
(*2)
(*1)
(*2)
×
%RegExp(.*)%
正規表現にマッチする任意の文字列
比較対象も指定する関数で使えるかどうか。
例:
例:
比較対象を指定しない関数で使えるかどうか。
サンプル
ABC
***%FullPath(.)%***
***%RegExp(.*)%***
ABC
***C:\FolderA***
***01234567879***
展開
%MultiLine%
×
複数行にマッチする (*4)
(*4)
関数一覧
%MultiLine% は、任意の複数行とマッチします。
また、%MultiLine% の直後にテキスト(%を使った関数可能)を置くと、その複数行が
マッチするかどうかをチェックします。
start
%MultiLine%
end
start
Line1
Line2
Line3
end
展開
展開
start
C:\FolderA>
C:\FolderA>
C:\FolderA>
end
start
%MultiLine%%FullPath(.)%>
end
関連
→ URL にプレースホルダーを含める
キーワード:
%Env(USERPROFILE)%
環境変数 USERPROFILE の値
%FullPath(x)% の x に相対パスを指定したときの基準フォルダーは、%FullPath(x)% を
記述したファイルがあるフォルダーです。
(*3)
(*3)
ParsePercentVariableString  "abc %VAR1%, %VAR2% def", sub_strings, variables
Assert  IsSameArray( sub_strings, Array( "abc ", ", ", " def" ) )
Assert  IsSameArray( variables, Array( "%VAR1%", "%VAR2%" ) )
Sub  ParsePercentVariableString( the_String as string, out_SubStringArray as array of string,
    out_VariableArray as array of string )
文字列の中の % を使った変数の部分とそれ以外の部分に分割します。
【引数】
the_String
out_SubStringArray
分割する前の文字列
変数以外の部分の配列
out_VariableArray
変数の部分の配列
サンプル
ソース
関連
→ ToolsLib.vbs
→ T_Str.vbs
テスト
T_ParseDollarVariableString
ソース
→ ToolsLib.vbs
テスト
→ T_fc.vbs
T_ReplaceStringTemplate
Sub  ReplaceStringTemplate( FolderPath as string, RegularExpressionPart as string,
    TemplateBefore as string, TemplateAfter as string, Opt as Empty )
テキストファイルの中をキーワードで検索し、テンプレートを置き換えます。
【引数】
FolderPath
RegularExpressionPart
検索対象フォルダーやワイルドカード
TemplateBefore
置き換える前のテンプレート(複数行可)
Opt
オプション、または、Empty
置き換える前のキーワード。複数行不可
置き換えた後のテンプレート(複数行可)
TemplateAfter
関連
テンプレートの中に次の予約変数を記述することができます。
${FileName}
ファイル名に置き換わります
置き換えた後のテンプレートにある変数が、置き換える前のテンプレートにないときは、
変数のまま残ります。 ただし、Opt 引数に dictionary 型を指定して、変数に一致する
キーに対応した値に置き換えることもできます。
@param   ${Arguments}
@return  ${RerutnValue}
サンプル
関数名: ${FunctionName}
引数:   ${Arguments}
返り値: ${RerutnValue}
補足:   ${Note}
TemplateBefore
TemplateAfter
のように指定した場合、FolderPath にマッチしたあるファイルの内容は、次のように変化します。
@param   First Parameter
@return  None
関数名: ${FunctionName}
引数:   First Parameter
返り値: None
補足:   
予約変数
RegularExpressionPart 引数に指定するキーワードは、TemplateBefore に含まれるキーワードを
正規表現で指定します。 キーワードは、TemplateAfter に含まれていなくても構いません。
この引数を使って内部で高速なファイル検索が行われます。
"" を指定すると、すべてのファイルに対して置き換えを試みます。
ただし、Opt 引数に次のように指定したものとします。
Dict(Array( "${Note}", "" ))
TemplateBefore に指定した変数(${ … } の部分)は、TemplateAfter に指定した ${ … } の
部分に入ります。
Opt 引数には、Empty か、辞書型で変数のデフォルト値を指定できます。 TemplateBefore に
ない変数が TemplateAfter にあるときは、その変数をここで指定した値に置き換えます。
以上のテンプレートは、XML ファイルに記述することができます。
テンプレートのサンプル